/*
 * log4cpp.h
 *
 *  Created on: Jan 10, 2012
 *      Author: sihai
 */

#ifndef LOG4CPP_H_
#define LOG4CPP_H_

#include <stdio.h>
#include <iostream>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

/*
 *最大行长度(字节)
 */
#define MAX_LINE_LENGTH 1024

/*
 *默认的日志缓冲大小，字节
 */
#define DEFAULT_LOGGER_BUFFER_SIZE 8192

/**
 *默认的固定大小的日子文件(128M字节)
 */
#define DEFAULT_FIXED_SIZE  128 * 1024 * 1024

/*
 *日志级别
 *	DEBUG	调试级别，级别最低
 *	INFO	一般级别，正常信息
 *	WARN	警告级别，警告信息
 *	ERROR	错误级别，错误信息
 *	FATAL	严重级别，严重错误信息
 */
typedef enum {DEBUG=0, INFO, WARN, ERROR, FATAL} Level;

/**
 *日志类型：
 *	CONSOLE_LOGGER						日志直接输出到控制台(stdout)
 *	FIXED_SIZE_ROLLING_FILE_LOGGER		固定大小的日志文件,日志文件达到固定大小后,切换日志
 *	DAILY_ROLLING_FILE_LOGGER			每天切换的日志
 */
typedef enum {CONSOLE_LOGGER=0, FIXED_SIZE_ROLLING_FILE_LOGGER, DAILY_ROLLING_FILE_LOGGER} LoggerType;

/*
 *
 */
class Logger
{
	protected:
		//==========================================================
		//					底层实现
		//==========================================================
		virtual void log(const char* msg) = 0;
	public:

		/*
		 *构造函数
		 */
		Logger();

		/*
		 *析构函数
		 */
		virtual ~Logger();

		/*
		 *初始化
		 *
		 */
		virtual bool init();

		/*
		 *
		 */
		void log(Level level, const char* msg);

		/*
		 *
		 */
		void logv(Level level, const char* format, ...);

		//==========================================================
		//					Debug级别
		//==========================================================
		/*
		 *
		 */
		void log_debug(const char* msg);

		/*
		 *
		 */
		void log_debug_v(const char* format, ...);

		//==========================================================
		//					Info级别
		//==========================================================
		/*
		 *
		 */
		void log_info(const char* msg);

		/*
		 *
		 */
		void log_info_v(const char* format, ...);

		//==========================================================
		//					Warn级别
		//==========================================================
		/*
		 *
		 */
		void log_warn(const char* msg);

		/*
		 *
		 */
		void log_warn_v(const char* format, ...);

		//==========================================================
		//					Error级别
		//==========================================================
		/*
		 *
		 */
		void log_error(const char* msg);

		/*
		 *
		 */
		void log_error_v(const char* format, ...);

		//==========================================================
		//					Fatal级别
		//==========================================================
		/*
		 *
		 */
		void log_fatal(const char* msg);

		/*
		 *
		 */
		void log_fatal_v(const char* format, ...);
};

/**
 * Logger链表元素
 */
typedef struct LoggerEntry
{
	Logger* logger;
	struct LoggerEntry* next;
} LoggerEntry;

/*
 *
 */
class LoggerFactory
{
	private:
		static volatile LoggerEntry * loggerlist;

	public:
		/*
		 *buffersize = 0,不缓冲
		 */
		static Logger* get_logger(LoggerType type, int buffersize, ... /* const char* logfile */);
};

#endif /* LOG4CPP_H_ */
